#pragma once

#include <memory>
#include <mutex>

namespace toolsLib
{

template <typename T>
class singletonBase
{
  public:
    // 获取、创建单例对象
    template <typename... Args>
    static std::shared_ptr<T> getInstance(Args&&... args)
    {
        // 使用双重检查锁定模式，但C++11的static局部变量初始化是线程安全的
        // 这里使用std::call_once确保只初始化一次
        std::call_once(initFlag, [&]() {
            instance = std::make_shared<T>(std::forward<Args>(args)...);
        });
        return instance;
    }

    // 主动删除实例
    static void deleteInstance()
    {
        std::lock_guard<std::mutex> lock(mutex);
        if (instance) {
            instance.reset();
            instance = nullptr;
        }
    }

  private:
    explicit singletonBase() = default;
    singletonBase(const singletonBase&) = delete;
    singletonBase& operator=(const singletonBase&) = delete;
    ~singletonBase() = default;

  private:
    static std::shared_ptr<T> instance;
    static std::mutex mutex;
    static std::once_flag initFlag;
};

template <typename T>
std::shared_ptr<T> singletonBase<T>::instance = nullptr;

template <typename T>
std::mutex singletonBase<T>::mutex;

template <typename T>
std::once_flag singletonBase<T>::initFlag;

}  // namespace toolsLib